// 整数转换为枚举

/*
#include <stdio.h>

enum atomic_number {
    HYDROGEN = 1,
    HELIUM = 2,
    // ...
    IRON = 26,
};

int main(void)
{
    enum atomic_number element = 26;

    if (element == IRON) {
        printf("Beware of Rust!\n");
    }

    return 0;
}



*/

#[cfg(test)]
mod try_from {
    enum MyEnum {
        A = 1,
        B,
        C,
    }

    fn main() {
        // 将枚举转换成整数，顺利通过
        let x = MyEnum::C as i32;

        // 将整数转换为枚举，失败
        match x {
            // MyEnum::A => {}
            // MyEnum::B => {}
            // MyEnum::C => {}
            _ => {}
        }
    }

    impl From<i32> for MyEnum {
        //实现类型转换
        fn from(value: i32) -> Self {
            return MyEnum::C;
        }
    }
    // 在 Rust 1.34 后，可以实现TryFrom特征来做转换:
    #[test]
    fn str() {
        let x = MyEnum::C as i32;

        match x.try_into() {
            Ok(MyEnum::A) => println!("a"),
            Ok(MyEnum::B) => println!("b"),
            Ok(MyEnum::C) => println!("c"),
            Err(_) => eprintln!("unknown number"),
        }
    }
}
// 邪恶之王 std::mem::transmute
// 最好使用#[repr(..)]来控制底层类型的大小，免得本来需要 i32，结果传入 i64，最终内存无法对齐，产生奇怪的结果
